#pragma once
#define  _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
#include<string.h>
#include<stdbool.h>
#include<windows.h>
#include<math.h>
#include<time.h>

//int main()
//{
//	int n = 10, m = 20, t = 30;
//
//	const int* p1 = &n; //const修饰*p1，不可更改指向的内容
//	int* const p2 = &m; //const修饰p2指针，p2不能更改指向，但是指向的值可以修改
//
//	*p1 = 1;
//	*p2 = 2;
//
//	p1 = &t;
//	p2 = &t;
//	return 0;
//}

//柔性数组
//typedef struct arr
//{
//	int size;
//	int array[];
//};
//
//int main()
//{
//	arr* a = (arr*)malloc(sizeof(arr) + 20 * sizeof(int)); //数组申请20个空间
//	a->size = 20;
//	for (int i = 0; i <= 20; ++i)
//	{
//		a->array[i] = i;
//	}
//	for (int i = 0; i <= 20; ++i)
//	{
//		printf("%d\n", a->array[i]);
//	}
//	return 0;
//}

typedef struct ALL
{
	int mp;
}ALL;

typedef struct A
{
	ALL AL;
	void (*fun)();
}A;

typedef struct B
{
	ALL AL;
	void (*fun)();
}B;

typedef struct C
{
	ALL AL;
	void (*fun)();
}C;

void afun()
{
	printf("A\n");
}

void bfun()
{
	printf("B\n");
}

void cfun()
{
	printf("C\n");
}

int main()
{
	A a = { 1,afun };
	B b = { 2,bfun };
	C c = { 3,cfun };

	//仿多态 - 切片成为父类对象
	ALL* al[3] = { (ALL*)&a,(ALL*)&b,(ALL*)&c };

	printf("%d\n", al[0]->mp);
	printf("%d\n", al[1]->mp);
	printf("%d\n", al[2]->mp);

	((A*)al[0])->fun();
	((B*)al[1])->fun();
	((C*)al[2])->fun();

	return 0;
}



